מבוא לאסמבלי מאת אופיר בק חלקים נרחבים ממאמר זה נכתבו בהשראת הספר "ארגון המחשב ושפת סף" אשר נכתב ע"י ברק גונן לתוכנית גבהים של משרד החינוך.

Similar documents
לאחר מכן נוכל לכתוב תוכניות שכוללות אלגוריתמים

תצוגת LCD חיבור התצוגה לבקר. (Liquid Crystal Display) המערכת.

7 קרפ תויגול,תויטמתירא תודוקפ הזזהו

ASP.Net MVC + Entity Framework Code First.

Rules Game (through lesson 30) by Nancy Decker Preparation: 1. Each rule board is immediately followed by at least three cards containing examples of

עד כה עסקנו בתוכניות שמתקדמות פקודה אחרי פקודה העתק ל- ax את הערך 3 העתק ל- bx את הערך 4 הוסף ל- ax את bx כפול את התוצאה ב- 2 והעתק ל- cx

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

זה. Nir Adar

ניפוי שגיאות )Debug( מאת ישראל אברמוביץ

THINKING ABOUT REST THE ORIGIN OF SHABBOS

המחלקה למדעי המחשב, אוניברסיטת בן גוריון מבני נתונים, סמסטר אביב 2102 עבודת בית מספר - 2 מעשית

המבנה הגאומטרי של מידה

מבוא לתכנות ב- JAVA תרגול 7

מכונת מצבים סופית תרגול מס' 4. Moshe Malka & Ben lee Volk

Hebrew Ulpan HEB Young Judaea Year Course in Israel American Jewish University College Initiative

מבוא למחשב בשפת פייתון

A R E Y O U R E A L L Y A W A K E?

קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות.

טכנולוגיית WPF מספקת למפתחים מודל תכנות מאוחד לחוויית בניית יישומיי

שאלות חזרה לקראת מבחן מפמ"ר אינטרנט וסייבר

Reflection Session: Sustainability and Me

Practical Session No. 13 Amortized Analysis, Union/Find

סיכומים למבחן בקורס מבנה מחשבים

תכנות בטוח חלק ב ' מאת עידו קנר

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 134 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 37

זו מערכת ישרת זוית )קרטזית( אשר בה יש לנו 2 צירים מאונכים זה לזה. באותו מישור ניתן להגדיר נקודה על ידי זוית ורדיוס וקטור

NTFS ADS Magic Tricks

בוחן בתכנות בשפת C בצלחה

A JEW WALKS INTO A BAR: JEWISH IDENTITY IN NOT SUCH JEWISH PLACES

עץ תורשה מוגדר כך:שורש או שורש ושני בנים שכל אחד מהם עץ תורשה,כך שערך השורש גדול או שווה לסכום הנכדים(נכד-הוא רק בן של בן) נתון העץ הבא:

Patents Basics. Yehuda Binder. (For copies contact:

Summing up. Big Question: What next for me on my Israel Journey?

Name Page 1 of 6. דף ט: This week s bechina starts at the two dots in the middle of

Computer Structure. Exercise #1 יש להגיש את התשובות הסופיות על גבי טופס זה.

מבוא לשפת C תירגול 1: מבוא מבוא לשפת סי - תירגול 1

יחידה ארגון המחשב ושפת סף: שאלות תרגול

DNS פרק 4 ג' ברק גונן מבוסס על ספר הלימוד "רשתות מחשבים" עומר רוזנבוים 1

מבנה מחשבים ספרתיים תרגול מס' חזרה על ארכיטקטורת ה-

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

מבוא לשפת C מבוא לשפת סי - תירגול 1

Advisor Copy. Welcome the NCSYers to your session. Feel free to try a quick icebreaker to learn their names.

A Long Line for a Shorter Wait at the Supermarket

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 102 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 5

Privilege Escalation

מושגים בסיסיים תלמידים והורים יקרים,

מספר השאלון: Thinking Skills נספח: כישורי חשיבה )לפרק ראשון ושני( א נ ג ל י ת (MODULE F) ספרות )מילון הראפס אנגלי-אנגלי-ערבי(

חטיבת המינרלים החיוניים תתמקד בשוקי האגרו וחטיבת הפתרונות המיוחדים תשמש כחטיבה התעשייתית; כיל דשנים מיוחדים תשולב בחטיבת המינרלים החיוניים;

תכניות סטנדרטיות ב UNIX שרשור פקודות באמצעות Pipeline עבודה ב- bash

תרגול 8. Hash Tables

בהצלחה! (MODULE C) Hoffman, Y. (2014). The Universal English-Hebrew, Hebrew-English Dictionary

Yetzer Shalom: Inclinations of Peace

אנגלית (MODULE E) בהצלחה!

דיאלוג מומחז בין מרטין בובר וקרל רוג'רס

WALTZ WITH BASHIR Brian J. Arnold Adaptation script for DVD Plus - English & Hebrew February 10, 2009

Theories of Justice

א נ ג ל י ת בהצלחה! ב. משרד החינוך בגרות לנבחנים אקסטרניים )מילון הראפס אנגלי-אנגלי-ערבי( השימוש במילון אחר טעון אישור הפיקוח על הוראת האנגלית.

ANNEXURE "E1-1" FORM OF IRREVOCABLE STANDBY LETTER OF CREDIT PERFORMANCE OF CONTRACT (WHERE PRICES ARE NOT LINKED TO AN ESCALATION FORMULA)

פרצות אבטחה נפוצות בהעלאת קבצים בעזרת PHP


שיא הסי-ים יורם ביברמן כל הזכויות שמורות למחבר. אין לעשות כל שימוש מסחרי בספר זה או בקטעים ממנו. ניתנת הרשות להשתמש בו לצורכי לימוד של המשתמש בלבד.

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE F) ספרות או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

תכנית סטארט עמותת יכולות, בשיתוף משרד החינוך א נ ג ל י ת שאלון א' Corresponds with Module A (Without Access to Information from Spoken Texts) גרסה א'

אנגלית שאלון ז' ג רסה א' הוראות לנבחן בהצלחה! )4( ההנחיות בשאלון זה מנוסחות בלשון זכר ומכוונות לנבחנות ולנבחנים כאחד. (MODULE G)

יסודות מבני נתונים. תרגול :9 ערימה - Heap

הטכנולוגיה בחינוך ד ר קובי גל אוניברסיטת בן גוריון בנגב

ב. משרד החינוך בגרות לנבחנים אקסטרניים א נ ג ל י ת (MODULE B) הוראות מיוחדות: )2( בתום הבחינה החזר את השאלון למשגיח. בהצלחה!

NATIONAL COUNCIL OF YOUNG ISRAEL. Shavuot Nation JEWISH EDITION. Compiled by Gabi Weinberg Teen Program Director

סיכומים למבחן בקומפילציה

שאלון ד' הוראות לנבחן

ב. משרד החינוך בגרות לנבחנים אקסטרניים א נ ג ל י ת (MODULE B) הוראות מיוחדות: )2( בתום הבחינה החזר את השאלון למשגיח. בהצלחה!

NJ NCSY Winter Regional פירסומי ניסא Publicizing the Miracle of Hanukah

אנגלית ספרות בהצלחה! /המשך מעבר לדף/ נספח: כישורי חשיבה )לפרק ראשון ושני( או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

מדריך למשתמש התקנה עצמית

FULL ARTICLE ACTIVE DIRECTORY

מודל מעבד-זיכרון רוחב הקו בביטים בין המשתנה למעבד ב- PDP כיווני העברת המידע במודל מעבד-זיכרון SFS CPU MDR MEM MAR

Redirection The Input Buffer

Water Security in the Middle East Source of Tension or Avenue for Peace

Mage lvl 90 - The Magento RCE

מבו א ל- VHDL אז מה י ה י ה לנ ו ה י ו ם... מהי שפת הגדרת חומרה ולשם מה דרושה תיאור, סימולציה, סינתזה

תכנית סטארט עמותת יכולות, בשיתוף משרד החינוך א נ ג ל י ת שאלון ב' Corresponds with Module B גרסה ב' הוראות לנבחן

הנדסה-לאחור: שרשרת העלייה של Windows 7 חלק שני - VBR

ãówh,é ËÓÉÔê ÌW W É Å t" Y w f É ËÓÉÑ É èw É f Ñ u ð NNM YóQ' ÌW W É Y ÉgO d óqk É w f ym Éd É u ð NNM ÌWNQMH uqo ð NNM ÌWNQMH

SPSS 10.0 FOR WINDOWS

Chofshi.

3. class attr_accessor def end 9. end puts "

Genetic Tests for Partners of CF patients

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות או מילון אנגלי-עברי-עברי-אנגלי

הבינגמה הדובע תביבסב תונכתל ריהמ ךירדמ

שאלון ו' הוראות לנבחן

הקדמה בדיקת תמיכה ב- SSL מאת עידו קנר

הבסיס כתיבת התכנית הראשונה שימוש במשתנים. הטיפוס הבסיסי object. הטיפוס הבסיסי string משפטי בקרה. שימוש ב- Enumerations. שימוש ב- Namespaces

מספר השאלון: הצעת תשובות לשאלות בחינת הבגרות אנגלית (MODULE C) מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי قاموس إنجليزي - إنجليزي - عربي

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE F) ספרות מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי

T H E S U N F L O W E R L I M I T S T O F O R G I V E N E S S

FULL ARTICLE ACTIVE DIRECTORY

CML כנס שנתי של מודעות ל- CML 4-6 לאוקטובר 2018, מלון רמדה, חדרה

Operating Systems, 142. Practical Session 12 File Systems, part 2

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

JUDAISM AND INDIVIDUALITY

התכנית הראשונה שלי

Transcription:

מאת אופיר בק חלקים נרחבים ממאמר זה נכתבו בהשראת הספר "ארגון המחשב ושפת סף" אשר נכתב ע"י ברק גונן לתוכנית גבהים של משרד החינוך. הקדמה בסדרת המאמרים הקרובה, אנחנו הולכים ללמוד על השפה אסמבלי, על השימוש בה ואף נבנה בעזרה מספר תוכנות קטנות בשביל הכיף. במבוא נסביר קצת על אסמבלי, איך להריץ אותו ונראה את הקוד הראשון שלנו. אך בשלב זה אסביר בעיקר על מבנה המחשב, מידע אשר הכרחי בשביל לדעת אסמבלי. מהי שפת אסמבלי? "שפת סף אשר נקראת גם אסמבלי היא שפת התכנות הבסיסית ביותר והקרובה ביותר לשפת מכונה." - ויקיפדיה. בשונה מהרבה שפות אחרות שניתן ללמוד, כדי ללמוד אסמבלי צריך לדעת קצת יותר על איך המחשב עובד, אז אנחנו נתמקד בדרישות הידע הכי פשוטות בחלק הזה. התפתחות שפות התכנות בתחילה כדי להורות למחשב לבצע חישובים, מפתחים נדרשו לרשום את שפת המכונה, עליה נרחיב בהמשך. כלומר קודים היו נראים ככה: ההוראות בשפה הבינארית, 1010 0011 0001 0000 0001 1001 1100 הבעיות הראשיות הן שאי אפשר לקרוא את הקוד ולהבין אותו, וקשה למצוא טעויות. כאן בדיוק נכנסת שפת האמסבלי. הפקודות של שפת האסמבלי הן באנגלית, קל להבין את משמעותן ולמצוא טעויות בקלות רבה יותר. לכן נקראת שפת האסמבלי שפת סף, כי היא על סף להיות שפת מכונה. הפקודות של השפה דרושות הכרה עמוקה עם המעבד כדי למנוע טעויות קריטיות שעלולות לפגוע במחשב, אך אנו נשתמש ב- Emulator שידמה מערכת הפעלה ישנה שתחסוך לנו את הדאגה.

מעל הרמה הזאת יושבות שפות יותר פשוטות לקריאה ולכתיבה, בנוסף למציאת טעויות, והן נקראות שפות עיליות, וביניהן ניתן למצוא שפות כמו #C ו- Java. השפות האלו בנויות עם מנגנונים שמונעים טעויות של המעבד ולא מריצים את הקוד במידה והם מוצאים טעויות. הן בעצם 'מסתירות' מהתוכניתן את המעבד. למה לא ללמוד אסמבלי? כן, אני לא הולך להסתיר מכם את הקשיים שיש בלימוד אסמבלי: 1. מאז שאסמבלי פותחה )בשנת 1949( העולם התקדם ויש שפות תוכנה מודרניות 2. אסמבלי היא שפה שקשה ללמוד 3. מסובך וארוך לכתוב קודים בשפת אמסבלי 4. קשה לבצע דיבאג )למצוא שגיאות ולנפות אותן( באסמבלי, לעומת השפות העיליות קובץ #C למה כן ללמוד אסמבלי? בכל זאת, יש יתרונות בלימוד השפה וידיעתה: 1. ניצול מיטבי של משאבי המעבד 2. עבודה מול החומרה של המחשב 3. גודל קובץ קטן מאוד ביחס לשפות אחרות )ראיתם פעם את התיקייה שנוצרת עבור כל קצרצר?( 4. הבנה עמוקה של אופן פעולות המחשב )אין דברים שמוסתרים מהתוכניתן( 5. רכישת מימנויות של סדר וארגון שיטות ספירה בני אדם נוהגים לספור בשיטה של 10 ספרות, מ- 0 ועד 9, שכאשר אנו מוסיפים ספרה משמאל לספרה הראשונה אנו מגדילים את הערך של הספרה השמאלית פי 10 והספרה הבאה אחריה תהיה גדולה פי 100 שזה בעצם 10² וכן הלאה, לדוגמה 16 זה בעצם 10+6 1, והמספר 458 הוא בעצם 10+8 10²+5 4. לעומת זאת, המחשב סופר בבסיס 2, כלומר, הוא משתמש רק בערכים 1 ו- 0. גם פה ייצוג המספרים הגדולים מכמות הספרות נעשים באמצעות הוספה של מספר משמאל למספר השמאלי ביותר. לדוגמה כדי לייצג את המספר שמוכר לנו כ- 2 אנו נרשום 10 בבסיס הבינארי )2(, מכיוון ש 2+0 1 = 2. נהוג לרשום את הקוד הבינארי בבלוקים של ארבעה תווים כדי להקל עלינו לקרוא אותו ולרשום בסיום b. כך לדוג' אנו נרשום את המספר 2 בבסיס 2 בתור 0010b, ואת המספר 15 בתור 1111b. כל תו בינארי נקרא סיבית - סיפרה בינארית. 2

עם זאת, כדי להקל על התוכניתנים, המחשב יודע לקרוא גם בבסיס הקסדצימלי )16(. בבסיס הזה אנו משתמשים בספרות ובנוסף להן בתווים A עד F, כדי להשלים את ששת נהוג לרשום את המספר עם האות h בסופו או 0x בתחילה. הספרות החסרות. בבסיס הזה כדי לתת למחשב את המספר הדצימלי, פשוט לא מוסיפים אף סימן בתחילה או בסוף, וכך הוא מניח שמדובר בשיטת הספירה שאנו משתמשים. שימו לב! ניתן להמיר בין הבסיסים הקסדצימלי והבינארי בקלות, מכיוון שכל 4 ביטים מייצגים תו הקסה אחד, כך ש 0001b=1h ו-.1111b=Fh כאשר אנו עובדים עם בית אחד, הערכים נעים בין 0 ל- 255, אך כאשר אנו רוצים לייצג מספר שלילי, הם נעים בין 128- ל- 127. המחשב לא באמת מבדיל בין המספרים, אך בעזרת פעולות מסויימות אנו מגדירים לו כיצד להתייחס אליהם. השיטה להתייחסות לקוד בינארי כשלילי נקראת "משלים ל- 2 ". כדי לייצג מספר בשיטה הזו, אנו מציגים אותו בפן החיובי, הופכים את כל הביטים ומוסיפים אחד. כלומר, המספר 1- בשיטה הזו יתואר בצורה הבאה: 1( תחילה נביע את המספר 1 באופן הבא: 0000. 0001 2( נהפוך את כל הביטים: 1111. 1110 )3 נוסיף.1111 1111 :1 וככה אנו מביעים את המספר 1-. בשיטה הזו כל מספר שהביט השמאלי שלו הוא 1, הוא שלילי. מבנה המחשב כמו שהזכרנו קודם, אסמבלי עובד בצורה הדוקה מול החומרה של המחשב, ולכן יש מספר יתרונות בהכרת המחשב והמבנה שלו: 1. אופטימיזציה של הקוד 2. הקטנת גודל הזיכרון של חלקים בקוד )בהמשך נגלה למה זה משמעותי( 3. מאפשר דיבאג יותר טוב של הקוד. אנחנו נעבוד עם מעבד 8086 של אינטל, שיצא בשנת 1978 והיה הראשון בסדרה 80x86. הסיבה שעבודה איתו היא רלוונטית היא בגלל עיקרון שנקרא "תאימות לאחור", לפיו גם מעבדים חדשים יותר של אינטל מסוגלים לעבוד עם הקוד שנועד למעבד ישן יותר. 3

המעבד הנ"ל בנוי בארכיטקטורה שנקראת "ארכיטקטורת פון ניומן", על שם היוצר של המעבד, ג'ון פון ניומן. לפי הארכיטקטורה, ישנם שלושה 'פסים' במערכת, שניתן לפנות רק אל אחד מהם בכל פעם. הפסים האלו הם הבקרה, המענים, והמידע. והם מחוברים בנפרד לרכיבי הקלט והפלט, למעבד ולזיכרון. פס הבקרה במחשב אחראי לומר למעבד האם אנו מבצעים פעולה של קריאה או של כתיבה, והאם לפנות לקלט-פלט או לזיכרון. הערכים של הקריאה והכתיבה הם בד"כ על 1, וכאשר read=0 מתבצעת קריאה, וכאשר write=0 מתבצעת כתיבה. פס המענים מודיע לאיזו כתובת בזיכרון המעבד מכוון. בזיכרון כל מקום הוא בגודל של בית )8 ביט(, והוא מסודר כך שאם נכניס אליו את הערך 1234h הוא יסודר כך שקודם כל יישמר בזיכרון 34h ורק לאחריו.little-endian שיטה זו קרויה 12h. פס הנתונים מעתיק נתונים ממקום למקום. מעבד עם פס נתונים רחב יותר יכול להעביר מידע מהר יותר. פס הנתונים של המעבד 8086 מסוגל להעתיק 16 ביטים בהעתקה אחת. צריך לשים לב שמבחינה עקרונית, זיכרון לא יכול להיות ריק, לעיתים הוא עם מידע שאנו הכנסנו לו, ואז הוא שמיש מבחינתנו, אך לעיתים מדובר במידע זבל שאינו אמין, וקריאה שלו עלולה לגרום לבעיות בהמשך. בנוסף לכך, מכיוון שלמעבד ה- 8086 יש מרחב כתובת של 20 ביטים, הוא משתמש בשיטה של segment )קטע בזיכרון( ו- offset )מיקום בקטע( ופונה לזיכרון במיקום שבנוי בתור.segment: offset המעבד המעבד 8086 בנוי ממספר חלקים, ואנו נפרט עבור אלו שחשובים לתכנות האסמבלי שלנו: רגיסטרים - :Registers הרגיסטרים מתחלקים לכמה סוגים, וכשנתחיל לכתוב תוכניות אנו גם נפרט עליהם. יחידה אריתמטית לוגית - Unit :Arithmetic Logic היחידה האריתמטית לוגית אחראית על ביצוע פעולות מתמטיות ולוגיות עבור המעבד. יחידת בקרה. יחידת קלט/פלט - Ports :I/O ניתן להשתמש ביחידה הזו כדי לקבל קלט מהמשתמש. שעון - :Timer מאפשר שימוש בפונקציות זמן מסוגים שונים. 4

אוגרים האוגרים, או כפי שנכנה אותם בד"כ, רגיסטרים, הם רכיבי חומרה שצמודים למעבד, והם מאפשרים לנו לבצע מגוון פעולות. בשונה מהזיכרון, אל האוגרים המעבד יכול לפנות באופן ישיר, וללא שום המתנה, בשל מיקומם הפיזי. הכמות והגודל של הרגיסטרים משתנה בין דורות של מעבדים, אבל אנחנו נשתמש ברגיסטרים של מעבד ה- 8086. לרגיסטרים שונים יש שמות שונים ומטרות רשמיות שונות, אך בעיקרון, את מרבית הפעולות רובם יכולים לבצע: :Accumulator - AX הרגיסטר המתמטי. הוא משמש לרוב הפעילויות האריתמטיות והלוגיות, והוא בד"כ יעיל יותר בביצוען. :Base - BX בדרך כלל משמש לשמירת כתובות בזיכרון, מכיוון שהוא בין היחידים שיש להם גישה לזיכרון. :Counter - CX רגיסטר שהוא ייעודי לספירה, עבור לולאות, כמות תווים בקובץ או במחרוזת וכדומה. :Data - DX שומר מידע עבור גישות מיוחדות לזיכרון או עבור פעולות מיוחדות, ועבור חלק מהפעולות האריתמטיות הוא משמש כרגיסטר נוסף.,BX ולאחסון נוסף :Destination Index משמשים לגישה לזיכרון עם ו Source Index - ו- DI SI ברגיסטרים..)Stack Segment( משמש לגישה לזיכרון של הסגמנט של המחסנית :Base Pointer - BP :Stack Pointer - SP שומר את המיקום הנוכחי במחסנית. בד"כ לא נשנה את הערך שלו ידנית, אבל זה עשוי להימצא יעיל לעיתים. כדי לאפשר גישה לקטעי זיכרון יותר קטנים מ- 16 ביט, אפשר לפנות רק לחצי רגיסטר, כאשר עבור,AX High החלק העליון, מלשון עבור החצי התחתון של הרגיסטר ו- H עבור ל- L אנו נהפוך את ה- X DX,CX,BX ו- Low. עבור הרגיסטרים SI ו- DI ניתן להוסיף בסוף L או H, מבלי למחוק את האות I. בנוסף לרגיסטרים הכלליים שהזכרנו קודם, ישנם גם רגיסטרים מיוחדים שנקראים רגיסטרי מקטע, או.Segment Registers ישנם ארבע רגיסטרים כאלה:,DS או,Data Segment מצביע על המקום בזיכרון בו שמורים המשתנים שלנו. 1.,CS או,Code Segment מצביע על המקום בו שמור הקוד שלנו בזיכרון המחשב. 2.,SS או,Stack Segment מצביע על איזור המחסנית בזיכרון המחשב. 3.,ES או,Extra Segment מצביע על אזור נוסף בזיכרון, שבמידה ואנו חורגים ממגבלות הקוד של 4. הסגמנטים 64KB( כל אחד( אנו יכולים להשתמש בו. 5

הרגיסטרים האחרונים הם,IP או ה- Pointer,Instruction שמצביע על המיקום בזיכרון של השורה הבאה להרצה, ו- FLAGS, שחשוב מאוד עבור ביצוע תנאים לוגיים ולולאות. הכנות לאסמבלי אנחנו נשתמש ב-++ notepad החינמי בתור סביבת העבודה שלנו, ובשביל להתאים את זה לשפת האסמבלי, ניגשים לכפתור Language בתפריט העליון ותחת האות A בוחרים באפשרות.Assembly בנוסף לכך, כדי להריץ את הקבצים אנו נשתמש באימולטור,DOSBox על השימוש בו נסביר בהמשך. תוספת אחרונה שלה אנו נזדקק היא TASM ו- TLINK. )Turbo Assembler( TASM הוא האסמבלר הבסיסי שבו נשתמש, והוא לא מורכב כמו רבים מהאחרים, כמו,NASM עליהם אולי ארחיב בהמשך. אנו משתמשים בהם )ובקבצים נוספים( כדי להפוך את קוד האסמבלי שלנו לקובץ מסוג,)Executable( EXE שנוכל להריץ ב- DOSBox. קישור להורדה מסודרת: https://drive.google.com/open?id=0b7fbwiszrchtam96njb6rmtpdzq חלצו את הקבצים, התקינו את DOSBox ואת,Notepad++ והעבירו את התיקיה BIN לכונן C. Base.asm פתחו את הקובץ base.asm שנמצא בתיקייה,BIN בעזרת.notepad++ הוא הבסיס הקבוע יחסית לכל קבצי האסמבלי שנכתוב, ועכשיו נסביר כל שורה ממנו. שימו לב, כל הפקודות באמסבלי הן לא Case,Sensitive כלומר, אפשר לרשום גם באותיות גדולות וגם באותיות קטנות. עם זאת, נהוג לרשום באותיות גדולות את ההוראות למהדר )האסמבלר( ובאותיות קטנות את הקוד עצמו: - IDEAL זאת הוראה לאסמבלר שלנו,,TASM שמודיע לו שאנו עובדים במצב אידיאלי. אנו לא נשתמש במצבים אחרים במסגרת הזו, אבל תוכלו למצוא עוד הרבה אופציות באינטרנט. - MODEL SMALL אנו נשתמש רק במודל הזה, בו יש segment אחד של קוד, ו- segment אחד של מידע )בנוסף לאחד של המחסנית, בו ניגע בהמשך(. - STACK 100h הצהרה על גודל המחסנית. כל מקום במחסנית הוא בית אחד, כלומר שמונה ביטים, שהם 2 תווים הקסדצימליים. אז בכתיבת הפקודה הזו, בעצם הצהרנו על 50 מקומות במחסנית. שימו לב שתמיד יש צורך להצהיר על גודל המחסנית, גם אם אתם לא מתכננים להשתמש בה. - DATASEG זה בעצם אזור המידע בקוד שלנו. כאן אנו מצהירים על המשתנים שאנו רוצים לשמור בזיכרון. תכף נדבר גם על איך עושים את זה. - CODESEG אזור הקוד בזיכרון שלנו. פה אנחנו רושמים את הקוד עצמו. 6

start: - הצהרה על תחילת הקוד. השם לא באמת משנה, אבל נהוג לקרוא לו.start הוא חייב להתאים גם לתגית הסיום,END שמופיע בסוף הקוד בתור.END start - mov as, @data אנחנו בעצם מעבירים לרגיסטר ax את המיקום שבו מתחילה שמירת הנתונים שלנו. צריך לבצע את זה בתחילת כל קובץ אסמבלי. השימוש בסימן ה-@ נועד כדי לקרוא למילה השמורה,data ולא למשתנה בשם הזה אם היינו מחליטים לבנות אחד שכזה. - mov ds, ax מעבירים לרגיסטר שאחראי על המשתנים את המיקום שבו הם שמורים. exit: - מלבד התגית הראשונה, שלה קראנו,start האסמבלי משתמש בשיטה שקוראים לה,Labeling ובעצם מתבססת על כך שנקרא לכל קטע קוד תחת איזושהי תגית, כדי שנוכל לקפוץ ביניהם בהמשך. כרגע לא נעמיק במשמעות השורות הבאות בקוד, מלבד,END start אותה כבר הסברנו קודם. בקובץ יש שיטה של אינדנטציה, או בעברית - הזחה. כל מה שנמצא תחת DATASEG נמצא TAB אחד פנימה יותר, וכן כל מה שנמצא תחת התגיות הפנימיות של שב- CODESEG. האסמבלי לא קורא את ההזחות בכל מקרה, אך הן מקלות על המשתמש את ההבנה של הקוד. DOSBox המקור של האימולטור DOSBox הוא בעצם במערכת ההפעלה DOS,Windows בשל מדיניות ה-"תאימות לאחור" שהזכרנו קודם לכן. שהייתה פעילה גם לאחר יציאת האימולטור נדרש מכיוון שלמרות מערכת ההגנה של,Windows שהייתה מונעת מאיתנו לפגוע במחשב בעזרת אסמבלי בדרך כלל, הוחלט שלא לתמוך באסמבלי 16 ביט, מה שמשאיר אותנו עם מערכת DOS חביבה. כשפותחים את ה- DOSBox הוא מוביל אותנו לכונן Z, שהוא כונן וירטואלי, אך כדי להקל את השימוש אנחנו נשתמש באוסף הפקודות הבא:.BIN בו נמצאת התיקייה,C: בקשת מעבר לכונן - mount c: c:\.c: מעבר לכונן - c: - cycles = max העלת מספר סיבובי המעבד למקסימום )אל תדאגו, זה רק המעבד המדומה, ומרבית המעבדים היום יעמדו בזה בקלות רבה(..bin מעבר לתיקייה - cd bin זהו! עכשיו אנו נמצאים בתיקייה בה נשמור את קבצי העבודה. אם תרצו פירוט על פקודות נוספות או על אלו שהזכרנו, תוכלו למצוא את זה באינטרנט. 7

השלב הבא הוא חשוב לא פחות - ההפיכה של קובץ ה- asm שלנו לקובץ שהדוס יוכל להריץ. את זה אנו נעשה בשני שלבים: 1. base.asm - tasm /zi או כל שם קובץ אחר שנבחר. זה בעצם אסמבלר, והוא מתרגם את שפת האסמבלי שלנו לשפת מכונה, כלומר קובץ עם סיומת.obj 2. base.obj - tlink v/ או כל שם קובץ אחר שנבחר. את הפעולה הזאת מבצע לינקר שיודע לאחד עבורנו כמה קבצים לתוכנית אחת, אך מכיוון ששלנו היא רק קובץ אחד בכל מקרה, השימוש הוא פשוט יחסית. עכשיו נוצר לנו קובץ.exe עכשיו אנו מגיעים לצומת, מכיוון שיש שתי דרכים להריץ את הקובץ, האחת עם,Turbo Debugger שייתן לנו את האופציה לעקוב אחרי פעולת התוכנית, ואחת רגילה. כדי להריץ תחת הדיבאגר, רושמים: td base וזה יפתח את הקובץ בצורה המתאימה. אחרת, רושמים רק את שם בקובץ, במקרה שלנו: base התהליך נשמע מתיש בשביל כל הרצה של קוד, נכון? לכן יש לנו את הקישור הבא: https://drive.google.com/open?id=0b7fbwiszrchtbzh3eljdzxnjyzg בקישור תמצאו RAR שמכיל שני קבצי,batch כלומר, בעלי סיומת.bat תעתיקו אותם אל התיקייה,bin ומעכשיו, כשתרצו להריץ קובץ בלי הדיבאגר, תוכלו לרשום,run base ובמידה ותרצו להשתמש בדיבאגר, תרשמו,rund base ולאחר בדיקת טעויות הקובץ ירוץ אם הוא לא נתקל בשגיאה. ו- FLAGS IP כבר הזכרנו את שניהם כשדיברנו על מבנה המחשב, אבל הפעם אנחנו ניכנס עמוק יותר לתוך השימוש של כל אחד מהם.,IP או Instruction Pointer הוא המצביע על הפקודה הבאה בקוד. הפקודות מגיעות בגדלים שונים, בד"כ בין בית אחד לשלושה, וה- IP אמור לוודא שהמעבד יקלוט את הפקודות כראוי, ולא יחבר בין כמה ביטים מפקודה אחת וכמה מאחרת, ויקבל הבנה שגויה של הפקודה שלנו. - FLAGS בשונה משאר הרגיסטרים, ב- FLAGS יותר קשה לעשות שימוש חופשי, ובפועל יש שם שימוש רק בחלק מהביטים לצורך תנאים וכד'. 8

הביטים השונים נותנים לנו מידע על מצב המעבד לאחר הפקודה האחרונה שהרצנו, ואנחנו נתמקד בארבעה מהדגלים, הנקראים דגלי בקרה: 1. Flag - Zero הערך של דגל הזה הופך ל- 1 במידה ולאחר הרצת הפקודה האחרונה האופרנד התאפס. האופרנד הוא בעצם מקום בזיכרון, או רגיסטר, שבמקרה הזה הם אלו שקיבלו את תוצאת הפעולה. לדוגמה, אם נחבר 1 ו- 1 - נקבל 0, ואז הדגל יקבל את הערך 1. גם חיבור של המספר 255 עם המספר 1 יהפוך לאפס, מכיוון שהוא חוצה את גבול המספרים שניתן לייצג בשמונה ביטים )זה לא יקרה לרגיסטרים של 16 ביט לדוגמה(. 2. Flag - Carry הדגל הזה מקבל את הערך 1 אם תוצאת הפעולה חורגת מתחום המספרים הרגילים )ללא התייחסות לשליליות(. עבור 8 ביט החריגה היא מהתחום של 0-255, ועבור 16 התחום הוא 65535-0 3. Flag - Overflow הדגל הזה מקבל את הערך 1 אם תוצאת הפעולה חורגת מתחום המספרים המסומנים, שעבור 8 ביט החריגה היא מ- 128 - עד 127+. עבור 16 ביט התחום הוא בין 32768- לבין.+32767 4. Flag - Sign דגל הסימן. מקבל את הערך 1 כאשר הביט השמאלי בתוצאה הוא 1 )כמו שהזכרנו קודם, במקרה כזה המספר הוא שלילי לפי שיטת המשלים ל- 2 (. הגדרת משתנים בתכנות נהוג להשתמש במשתנים כדי לשמור מספרים, והמקור לכך הוא באסמבלי, שבו משתמשים במשתנים כדי לחסוך את המבט לזיכרון בכל פעם שרוצים להשתמש בערך שמור. כמו שכבר הזכרנו קודם, את המשתנים אנו יוצרים ב- DATASEG של הקובץ שלנו באופן הבא: - Name size value כלומר כדי ליצור משתנה בשם age עם בגודל של בית אחד, עם הערך ההתחלתי 16, אנו נרשום ב- DATASEG : age db 16 הפירוש של DB הוא,Define Byte אך כדי ליצור משתנים בגדלים אחרים, צריך להחליף את הצירוף. ניתן ליצור משתנים בגודל מילה,)WORD( שהיא שני בתים בעזרת הצירוף,DW וליצור משתנה בגודל מילה כפולה )DWORD( בעזרת הצירוף.DD כדי לפנות למשתנים בקוד עצמו, אנו עוטפים אותם בסוגריים מרובעים משני הצדדים. לדוגמה, כדי להעביר למשתנה את הערך נשתמש בפקודה,mov שמזיזה ערכים בין 17, אנו age מיקומים, באופן הבא: mov [age], 5 9

ולא: mov 5, [age] הסיבה לכך היא שלפקודות באסמבלי יש עד שני אופרנדים, ועבור הפקודה,mov בשונה מרוב הפקודות האחרות, האופרנד הראשון שאנו מכניסים, במקרה הזה mov הוא אופרנד היעד, שאליו מועתק הערך מהאופרנד השני, שנקרא גם אופרנד המקור. כדי להגדיר מחרוזת, כלומר אוסף תווים אנו יכולים לרשום אותם החל מהתו הראשון באופן הבא: string db 'HELLO' במקרה כזה כל אחד מהתווים יישמר בבית נפרד, אחד אחרי השני, ברצף הנכון. באסמבלי יש גם הגדרה של מערכים, אך היא שונה במקצת: ArrayName SizeOfElement N dup(?) - ArrayName שם המערך )...DB, DW( גודל כל תא - SizeOfElement - N מספר הפעמים לביצוע ההעתקה של הערך )או רצף הערכים( בסוגריים..)duplicate( פקודת העתקה - dup גם באסמבלי יש אינדקסים במערך, שעוזרים לנו למצוא את המיקום של תא מסוים. האינדקס הראשון האו 0. כדי לקבוע את כל הקפיצות בין אינדקסים, צריך לספור את גודל התא, מכיוון שהזיכרון בנוי מבתים, ולכן במקרה של מערך מסוג WORD לדוגמה, האינדקס של התא השני יהיה 2 ולא אחד, מכיוון ש WORD מבוטא בגודל של שני בתים. 01

לסיכום למדנו את הבסיס לאסמבלי, לדוגמה שיטות ספירה )בינארית והקסדצימלית(, מבנה המחשב, וגם יצירת משתנים ומערכים. בפרק הבא נעסוק בפקודות בסיסיות ונכתוב קודים בסיסיים באמסבלי. על המחבר שמי אופיר בק, בן 16 מפתח תקווה. אני לומד בתכנית גבהים של מטה הסייבר הצה"לי וב- Security C, לאחר שסיימתי את לימודי המתמטיקה והאנגלית בכיתה י'. קשה למצוא חומר מעודכן בעברית, ולאחר שהמגזין הזה היווה עבורי מקור מידע נגיש, רציתי לתרום חזרה. זה המאמר הראשון שלי במגזין ובכלל. ניתן גם ליצור איתי קשר בכתובת.ophiri99@gmail.com קישורים לקריאה נוספת טורבו דיבאגר: https://en.wikipedia.org/wiki/borland_turbo_debugger מבנה המחשב: http://www.rup.co.il/sites/default/files/%20%d7%9e%d7%91%d7%a0%d7%94%20%d7%94%d7%9e %D7%97%D7%A9%D7%91.docx 00